contents
리눅스 파일 시스템은 데이터가 저장되고 검색되는 방식을 제어하는 복잡한 계층적 구조입니다. 그 핵심 설계는 "모든 것은 파일이다" 라는 강력한 철학에 의해 주도됩니다.
이는 문서와 프로그램뿐만 아니라 하드웨어 장치, 네트워크 연결, 심지어 실행 중인 프로세스에 대한 정보까지도 파일로 취급된다는 것을 의미합니다.
핵심 철학: "모든 것은 파일이다" 📜
이것이 이해해야 할 가장 중요한 개념입니다. 리눅스에서는 모든 시스템 리소스를 나타내기 위해 다양한 유형의 "파일"이 사용됩니다.
- 일반 파일 (
-): 텍스트, 이미지 또는 프로그램 바이너리와 같은 데이터를 포함합니다. - 디렉터리 (
d): 다른 파일과 그 아이노드 번호의 목록을 저장하는 특수 파일입니다. - 블록 장치 (
b): 하드 드라이브(/dev/sda)나 USB 드라이브처럼 데이터를 블록 단위로 읽고 쓰는 하드웨어 장치입니다. - 문자 장치 (
c): 키보드(/dev/input/...)나 터미널(/dev/tty)처럼 데이터를 한 번에 한 문자씩 전송하는 장치입니다. - 심볼릭 링크 (
l): 다른 파일의 경로를 가리키는 포인터 또는 바로 가기 역할을 하는 파일입니다. - 소켓 (
s): 프로세스 간 통신(IPC)에 사용되는 파일입니다. - 파이프 (
p): 프로세스 간에 흐르는 데이터를 위한 버퍼 역할을 하는 파일입니다.
이 철학이 강력한 이유는 ls, cat, grep, cp와 같은 동일한 도구 세트로 이 모든 다른 리소스와 통일된 방식으로 상호 작용할 수 있게 해주기 때문입니다.
가상 파일 시스템 (VFS) - 추상화 계층 🧩
리눅스는 네이티브 ext4부터 윈도우의 NTFS, macOS의 APFS에 이르기까지 수십 가지의 다양한 파일 시스템 유형을 지원해야 합니다. 이 복잡성은 가상 파일 시스템(VFS) 을 사용하여 관리됩니다.
VFS는 커널 내의 추상화 계층입니다. 애플리케이션이 어떤 파일 시스템과도 상호 작용하는 데 사용할 수 있는 단일하고 통일된 API를 제공합니다.
비유: VFS를 만능 전원 어댑터라고 생각해보세요. 텍스트 편집기와 같은 애플리케이션은 파일을 저장하기 위해 VFS에 "연결"하기만 하면 됩니다. 그러면 VFS는 "ext4 드라이버"와 통신해야 할지, "NTFS 드라이버"와 통신해야 할지를 파악하고, 해당 드라이버가 물리 디스크에 데이터를 쓰는 구체적인 세부 사항을 처리합니다.
이것이 바로 cp 명령어가 두 파일 시스템에 대해 아무것도 알 필요 없이 USB 스틱(FAT32)에서 하드 드라이브(ext4)로 파일을 복사할 수 있는 이유입니다.
파일 시스템 계층 표준 (FHS) - 디렉터리 구조 🗺️
대부분의 사용자가 파일 시스템으로 보는 것은 파일 시스템 계층 표준(FHS) 에 의해 정의된 표준 디렉터리 레이아웃입니다. 이 표준은 여러 리눅스 배포판에서 파일이 예측 가능한 위치에 있도록 보장합니다.
루트(/) 디렉터리 아래의 가장 중요한 디렉터리들은 다음과 같습니다.
/(루트): 최상위 디렉터리입니다. 시스템의 모든 것은 이 디렉터리 아래에 위치합니다./bin:ls,cp,mv,bash와 같이 모든 사용자에게 필요한 필수 바이너리(프로그램)를 포함합니다./sbin:reboot,fdisk,ifconfig와 같이 시스템 관리에 사용되는 필수 시스템 바이너리를 포함합니다./etc: 시스템 전반의 설정 파일을 포함합니다(예:/etc/passwd,/etc/fstab). 전체 OS를 위한 "설정" 폴더로 생각할 수 있습니다./home: 각 사용자의 개인 홈 디렉터리를 포함합니다. 문서, 다운로드, 개인 설정 파일 등을 저장하는 곳입니다(예:/home/username)./var: 시스템 작동 중에 변경되는 가변 데이터 파일을 포함합니다. 로그(/var/log), 캐시, 스풀 등을 여기서 찾을 수 있습니다./tmp: 재부팅 시 종종 비워지는 임시 파일을 위한 디렉터리입니다./usr: "사용자" 계층으로, 사용자가 설치한 대부분의 소프트웨어, 라이브러리, 문서가 포함됩니다. 종종 가장 큰 디렉터리입니다./dev: 모든 장치 파일을 포함합니다. 하드 드라이브(/dev/sda), 웹캠, 심지어 "null" 장치(/dev/null)까지 모두 파일로 존재합니다./proc: 디스크에 존재하지 않는 가상 파일 시스템입니다. 실행 중인 프로세스와 시스템 하드웨어에 대한 정보를 포함합니다./mnt&/media: USB 드라이브나 외장 하드 드라이브 같은 이동식 미디어를 위한 전통적인 마운트 지점입니다.
아이노드 (Inode) - 파일의 "데이터 시트" 📇
이것은 리눅스가 파일을 추적하는 방식의 저수준 세부 사항입니다. 파일을 저장하면 두 가지가 생성됩니다.
- 데이터 블록: 하드 드라이브의 블록에 저장되는 파일의 실제 내용입니다.
- 아이노드: 파일에 대한 모든 메타데이터를 저장하는 데이터 구조입니다.
파일 이름은 디렉터리 파일에 있는, 아이노드 번호를 가리키는 사람이 읽을 수 있는 레이블일 뿐입니다. 아이노드가 파일의 진정한 표현입니다.
아이노드는 다음을 저장합니다.
- 파일 유형 (일반 파일, 디렉터리, 링크 등)
- 권한 (소유자, 그룹, 읽기/쓰기/실행)
- 타임스탬프 (생성, 수정, 접근 시간)
- 파일 크기
- 파일 내용이 저장된 디스크의 데이터 블록을 가리키는 포인터 목록
중요하게도, 아이노드는 파일 이름을 저장하지 않습니다. 이 분리 구조가 하드 링크를 가능하게 합니다. 하드 링크는 디렉터리 내에서 정확히 동일한 아이노드 번호 를 가리키는 두 번째 파일 이름일 뿐입니다. 반면, 심볼릭 링크는 원본 파일의 텍스트 경로 를 내용으로 하는, 자신만의 아이노드를 가진 새로운 파일입니다.
일반적인 리눅스 파일 시스템 유형 🗄️
디스크를 포맷할 때 선택하는 "구체적인" 파일 시스템 형식입니다.
- ext4 (Fourth Extended Filesystem): 수년 동안 대부분의 리눅스 배포판의 기본값이었습니다. 믿을 수 없을 정도로 안정적이고 신뢰할 수 있으며, 저널링(충돌 후 데이터 손상을 방지하는 데 도움) 기능을 갖추고 있습니다.
- Btrfs (B-tree File System): 현대적인 "차세대" 파일 시스템입니다. CoW(Copy-on-Write) 파일 시스템으로, 효율적인 스냅샷, 내장 볼륨 관리, 데이터 무결성 검사와 같은 고급 기능을 제공합니다.
- XFS: 고성능 64비트 저널링 파일 시스템입니다. 매우 큰 파일(테라바이트 단위)과 병렬 I/O 처리에 뛰어나 서버에서 인기가 많습니다.
- ZFS (Zettabyte File System): 기술적으로 리눅스 커널의 일부는 아니지만 널리 사용됩니다. Btrfs와 마찬가지로 데이터 무결성, 스냅샷, 고급 저장소 기능에 중점을 둔 현대적인 파일 시스템입니다.
references